"""
模块和函数级是一对，类和方法级是一对。一般我们会创建测试类编写测试用例方法，
所以类和方法级别都是需要掌握的
模块级（setup_module/teardown_module）开始于模块始末，全局的，对整个.py文件起作用
函数级（setup_function/teardown_function） 只对函数用例生效（不在类中），对不在类中的方法起作用
类级（setupclass/teardown_class）只在类中前后运行一次（在类中），对单个类起作用
方法级（setup_dethod、teardown_method）开始于方法始末（在类中），对测试类中的测试方法起作用
"""
# 模块级别
"""
def setup_module():
    print("这是模块级的setup方法")
def teardown_module():
    print("这是模块级的teardown方法")
def test_dem1():
    print("测试用例1")

def test_dem2():
    print("测试用例2")
"""
"""
执行顺序：
这是模块级的setup方法
测试用例1
这是模块级的teardown方法

执行命令：pytest 04-setup和teardown.py
"""

# 函数级别
"""
def setup_function():
    print("这是函数级别的setup方法")
def teardown_function():
    print("这是函数级别的teardown方法")

def test_demo1():
    print("测试用例1")

def test_demo2():
    print("测试用例2")
"""
"""
这是函数级别的setup方法
测试用例1
这是函数级别的teardown方法

这是函数级别的setup方法
测试用例2
这是函数级别的teardown方法

执行命令：pytest 04-setup和teardown.py
"""

# 类级别
"""
class TestDemo:                # 类标题必须是Test开头的
    def setup_class(self):
        print("这是类级别的setup方法")

    def teardown_class(self):
        print("这是类级别的teardown方法")

    # 测试用例1
    def test_demo1(self):                 # 测试用例必须是test开头的
        print("这是demo1测试用例")

    def test_demo2(self):
        print("这是demo2测试用例")

    def test_demo3(self):
        print("这是demo3测试用例")
"""
"""
setup_class/teardown_class：都是通过类来控制的，整篇类只会执行一次
这是类级别的setup方法
这是demo1测试用例
这是demo2测试用例
这是demo3测试用例
这是类级别的teardown方法
"""
# 在类中的方法级别
class TestDemo2:
    def setup_method(self):
        print("这是方法级别的setup方法")
    def teardown_method(self):
        print("这是方法级别的teardown方法")
    def test_demo1(self):
        print("这是demo1测试用例")
    def test_demo2(self):
        print("这是demo2测试用例")
    def test_demo3(self):
        print("这是demo3测试用例")
"""
为每条测试用例都会执行一次setup和teardown

执行顺序：
这是方法级别的setup方法
这是demo1测试用例
这是方法级别的teardown方法

这是方法级别的setup方法
这是demo2测试用例
这是方法级别的teardown方法

这是方法级别的setup方法
这是demo3测试用例
这是方法级别的teardown方法

执行命令：pytest 04-setup和teardown.py
"""




